home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / cv_set6 / cv_set6s.lzh / GLX2RGB.S < prev    next >
Text File  |  1997-09-11  |  27KB  |  1,170 lines

  1. *********************************************************************************
  2. *    GLX to RGB converter                <GLX2RGB.X Ver0.01>    *
  3. *********************************************************************************
  4.  
  5.     .include    doscall.mac
  6.     .include    iocscall.mac
  7.     .include    myconst.h
  8.  
  9.     .text
  10.     .even
  11.  
  12. start:
  13.     lea.l    mysp(pc),sp        *スタックセット
  14.     lea.l    work(pc),a6
  15.  
  16.     lea.l    16(a0),a0        *余分なメモリ開放
  17.     suba.l    a0,a1
  18.     move.l    a1,-(sp)
  19.     move.l    a0,-(sp)
  20.     DOS    _SETBLOCK
  21.     addq.l    #8,sp
  22.  
  23.     bsr    cmdchk            *コマンドラインの解析
  24.     bsr    s_name_chk        *セーブファイル名のチェック
  25.     bsr    buf_get            *バッファ確保
  26.     bsr    name_get        *ファイル名を取得し処理する
  27.     bsr    buf_free        *バッファ開放
  28.     bsr    exit            *終了処理
  29.     DOS    _EXIT
  30.  
  31. *****************************************************************
  32. *    ファイル名を取得し、ファイルの読み込みを行う        *
  33. *****************************************************************
  34. name_get:
  35.     clr.w    file_cnt(a6)        *ファイル数のカウント初期化
  36.  
  37.     bsr    chkname            *ファイル名に対する前処理
  38.     bsr    chkext            *拡張子が省略されているかチェック
  39.  
  40.     move.w    #ARCHIVE,-(sp)        *最初のファイルを検索する
  41.     pea.l    arg1(a6)        *
  42.     pea.l    filbuf(a6)        *
  43.     DOS    _FILES            *
  44.     lea.l    10(sp),sp        *
  45.  
  46. loop:
  47.     tst.l    d0            *ファイルは見つかったか?
  48.     bmi    done            * 見つからなければ処理完了
  49.  
  50.     bsr    setpath            *得られたファイル名を
  51.                     * フルパスに再構成する
  52.  
  53.     bsr    main            *メイン処理
  54.  
  55.     pea.l    filbuf(a6)        *つぎのファイルを検索する
  56.     DOS    _NFILES            *
  57.     addq.l    #4,sp            *
  58.  
  59.     bra    loop            *繰り返す
  60.  
  61. done:
  62.     bsr    file_cnt_chk        *処理したファイル数のチェック
  63.     rts
  64.  
  65. *****************************************************************
  66. *    files実行に先立ってファイル名に前処理を加える        *
  67. *****************************************************************
  68. chkname:
  69.     pea.l    nambuf(a6)        *ファイル名を展開する
  70.     pea.l    arg1(a6)        *
  71.     DOS    _NAMECK            *
  72.     addq.l    #8,sp            *
  73.  
  74.     tst.l    d0            *d0<0なら
  75.     bmi    name_er            * ファイル名の指定に誤りがある
  76.  
  77.     beq    nowild            *d0=0ならワイルドカード指定なし
  78.  
  79.     cmpi.w    #$00ff,d0        *d0≠FFHなら
  80.     bne    wild            * ワイルドカード指定あり
  81.  
  82. noname:                    *ファイル名が指定されていない場合
  83.     lea.l    arg1(a6),a0        *バッファargに
  84.     lea.l    nambuf(a6),a1        * nameckで展開したパス名+'*.GLX'
  85.     bsr    strcpy            * を再構成する
  86.     lea.l    kome0(pc),a1        *
  87.     bsr    strcpy            *
  88.  
  89. wild:                    *ワイルドカードが指定された場合
  90.                     *何もしなくてよい
  91. cknam0:
  92.     rts
  93.  
  94. nowild:                    *ワイルドカードが指定されていない場合
  95.     move.w    #SUBDIR,-(sp)        *サブディレクトリであると仮定して
  96.     pea.l    arg1(a6)        * 検索してみる
  97.     pea.l    filbuf(a6)        *
  98.     DOS    _FILES            *
  99.     lea.l    10(sp),sp        *
  100.     
  101.     tst.l    d0            *見つかったか?
  102.     bmi    cknam0            * 見つからなければファイルだろう
  103.  
  104.     lea.l    arg1(a6),a0        *バッファarg1に
  105.     lea.l    komekome(pc),a1        * もとのファイル名+'\*.GLX'
  106.     bsr    strcat            * を再構成する
  107.  
  108.     bra    chkname            *nameckでファイル名を展開するために
  109.                     * サブルーチン先頭に戻る
  110.  
  111. *****************************************************************
  112. *    出力パス名をチェックする                *
  113. *****************************************************************
  114. s_name_chk:
  115.     lea.l    arg2(a6),a0        *出力パス名を指定したか?
  116.     tst.b    (a0)
  117.     beq    s_name_chk8        *してない
  118.  
  119.     pea.l    nambuf(a6)        *ファイル名を展開する
  120.     pea.l    arg2(a6)        *
  121.     DOS    _NAMECK            *
  122.     addq.l    #8,sp            *
  123.  
  124.     tst.l    d0            *d0<0なら
  125.     bmi    out_name_err        * パス名の指定に誤りがある
  126.  
  127.     beq    s_name_chk1        *d0=0ならワイルドカード指定なし
  128.  
  129.     cmpi.w    #$00ff,d0        *d0≠FFHなら
  130.     bne    out_name_err        * ワイルドカード指定あり
  131.  
  132. s_name_chk1:
  133.     lea.l    arg2(a6),a0        *ドライブ名を指定しているか?
  134.     cmp.b    #':',1(a0)
  135.     bne    out_name_err        *ドライブ名の指定に誤りがある
  136.  
  137.     tst.b    2(a0)            *ドライブ名のみか
  138.     bne    s_name_chk2        *違う
  139.     addq.l    #2,a0
  140.     bra    s_name_chk9
  141.  
  142. s_name_chk2:
  143.     moveq.l    #0,d0            *セーブ先ドライブ番号を求める
  144.     move.b    (a0),d0
  145.     bsr    toupper
  146.     sub.b    #'A',d0
  147.     add.b    #1,d0
  148.  
  149.     lea.l    spathbuf(a6),a1        *セーブ先ドライブ名
  150.     move.b    (a0),(a1)+
  151.     move.b    #':',(a1)+
  152.     move.b    #'\',(a1)+
  153.  
  154.     move.l    a1,-(sp)        *セーブ先パスをセーブ
  155.     move.w    d0,-(sp)
  156.     DOS    _CURDIR
  157.     addq.l    #6,sp
  158.  
  159.     lea.l    cpathbuf(a6),a2        *カレントパスをセーブしておく
  160.     DOS    _CURDRV
  161.     add.b    #"A",d0
  162.     move.b    d0,(a2)+
  163.     move.b    #':',(a2)+
  164.     move.b    #'\',(a2)+
  165.  
  166.     move.l    a2,-(sp)
  167.     move.w    #0,-(sp)
  168.     DOS    _CURDIR
  169.     addq.l    #6,sp
  170.  
  171.     pea.l    arg2(a6)        *コマンドラインで指定されたパスへ
  172.     DOS    _CHDIR            * 移動してみる
  173.     addq.l    #4,sp
  174.  
  175.     tst.l    d0            *d0が0でなければ
  176.     bmi    out_name_err        * パス名の指定に誤りがある
  177.  
  178.     pea.l    spathbuf(a6)        *セーブ先パスを戻す
  179.     DOS    _CHDIR
  180.     addq.l    #4,sp
  181.  
  182.     pea.l    cpathbuf(a6)        *カレントパスに戻す
  183.     DOS    _CHDIR
  184.     addq.l    #4,sp
  185.  
  186.     lea.l    arg2(a6),a0        *
  187.     bsr    set_en            *パス名の最後に\マークをセット
  188.     bra    s_name_chk9
  189.  
  190. s_name_chk8:
  191.     lea.l    arg2(a6),a0
  192.  
  193. s_name_chk9:
  194.     move.l    a0,nameichi(a6)
  195.     rts
  196.  
  197. *****************************************************************
  198. *    パス名に¥マークを連結する                *
  199. *****************************************************************
  200. set_en:
  201.     tst.b    (a0)+            *(a0)は0か?
  202.     bne    set_en            *そうでなければ繰り返す
  203.     subq.l    #1,a0            *行きすぎたから1つ戻る
  204.  
  205.     cmp.b    #"\",-1(a0)        *一番最後の文字が¥か
  206.     beq    set_en_            * ¥ならばスキップ
  207.     move.b    #'\',(a0)+        * ¥をセット
  208. set_en_:
  209.     rts
  210.  
  211. *****************************************************************
  212. *    files,nfilesで見付けたファイル名をフルパスに構成し直し    *
  213. *        arg1以降に格納する                *
  214. *****************************************************************
  215. setpath:
  216.     lea.l    arg1(a6),a0        *a0=コピー先
  217.     lea.l    nambuf(a6),a1        *a1=nameckで展開したパス名
  218.     bsr    strcpy            *コピーする
  219.     lea.l    filbuf(a6),a1        *a1=files,nfilesで見付けたファイル名
  220.     lea.l    30(a1),a1
  221.     bsr    strcpy            *連結する
  222.     rts
  223.  
  224. *****************************************************************
  225. *    文字列の連結および複写                    *
  226. *    リターン時a0は文字列末の00Hを指す            *
  227. *****************************************************************
  228. strcat:
  229.     tst.b    (a0)+            *(a0)は0か?
  230.     bne    strcat            *そうでなければ繰り返す
  231.     subq.l    #1,a0            *行きすぎたから1つ戻る
  232. strcpy:
  233.     move.b    (a1)+,(a0)+        *1文字ずつ
  234.     bne    strcpy            *終了コードまでを転送する
  235.     subq.l    #1,a0            *a0は進み過ぎている
  236.                     *a0は文字列末の00Hを指す
  237.     rts
  238.  
  239. *****************************************************************
  240. *    拡張子を補う                        *
  241. *****************************************************************
  242. chkext:
  243.     lea.l    arg1(a6),a0        *ファイル名のアドレス
  244.     lea.l    dext(pc),a1        *拡張子のアドレス
  245. chkext0:
  246.     cmp.b    #".",(a0)        *拡張子があるか
  247.     beq    chkext2
  248.     tst.b    (a0)+            *(a0)は0か?
  249.     bne    chkext0            *そうでなければ繰り返す
  250.     subq.l    #1,a0            *行きすぎたから1つ戻る
  251. chkext1:
  252.     move.b    (a1)+,(a0)+        *1文字転送
  253.     bne    chkext1            *終了コードまで繰り返す
  254. chkext2:
  255.     rts
  256.  
  257. *****************************************************************
  258. *    コマンドラインのチェックを行う                *
  259. *****************************************************************
  260. cmdchk:
  261.     lea.l    arg1(a6),a0        *a0=引数切り出し領域
  262.     clr.b    256(a0)            *出力ファイル名をちょっと初期化
  263.     addq.l    #1,a2            *a2=コマンドライン文字列先頭
  264.     sf    mflg(a6)        *CスイッチOFF
  265.  
  266. cmdchk0:
  267.     bsr    switch_chk        *スイッチのチェック
  268.  
  269.     tst.b    (a2)            *引数があるか?
  270.     beq    usage            *ないならファイル名が足りない
  271.     bsr    getarg            *ファイル名切り出し
  272.     lea.l    256(a0),a0        *a0=a0+256
  273.     bsr    switch_chk        *さらにスイッチのチェック
  274.     bsr    getarg            *ファイル名切り出し
  275.     bsr    switch_chk        *さらにスイッチのチェック
  276.     tst.b    (a2)            *引数があるか?
  277.     bne    usage            * あるなら引数が多い
  278. cmdchk1:
  279.     rts
  280.  
  281. *****************************************************************
  282. *    スペースを飛ばしつぎの引数先頭までポインタを進め    *
  283. *    スイッチがあれば処理してしまう                *
  284. *****************************************************************
  285. switch_chk:
  286.     bsr    skipsp            *スペースをスキップする
  287.     tst.b    (a2)            *まだスイッチがあるか?
  288.     beq    switch_chk2        *ないなら戻る(処理の振り分けを行う)
  289.  
  290.     cmpi.b    #'/',(a2)        *引数の先頭が
  291.     beq    switch_chk1        */,-であれば
  292.     cmpi.b    #'-',(a2)        *  スイッチ
  293.     beq    switch_chk1        *
  294.     bra    switch_chk2        *スイッチでないなら戻る
  295.  
  296. switch_chk1:
  297.     addq.l    #1,a2            *'/'や'-'の分ポインタを進める
  298.     tst.b    (a2)            *スイッチがあるか?
  299.     beq    usage            * ないなら使用方表示
  300.     move.b    (a2)+,d0        *1文字取り出す
  301.     bsr    toupper            *大文字に変換しておく
  302.  
  303.     cmpi.b    #'M',d0
  304.     beq    msw
  305.     bra    usage
  306.  
  307. msw:
  308.     tst.b    mflg(a6)
  309.     bne    usage
  310.     st    mflg(a6)
  311.     bra    switch_chk
  312.  
  313. switch_chk2:
  314.     rts
  315.  
  316. *****************************************************************
  317. *    ファイル名を切り出す                    *
  318. *****************************************************************
  319. getarg:
  320.     move.l    a0,-(sp)        *{レジスタ待避
  321. gtarg0:    tst.b    (a2)            *1)文字列の終端コードか
  322.     beq    gtarg1            *
  323.     cmpi.b    #SPACE,(a2)        *2)スペースか
  324.     beq    gtarg1            *
  325.     cmpi.b    #TAB,(a2)        *3)タブか
  326.     beq    gtarg1            *
  327. *    cmpi.b    #'-',(a2)        *4)ハイフンか
  328. *    beq    gtarg1            *
  329.     cmpi.b    #'/',(a2)        *5)スラッシュ
  330.     beq    gtarg1            *
  331.     move.b    (a2)+,(a0)+        * が現れるまで転送を
  332.     bra    gtarg0            * 繰り返す
  333. gtarg1:    clr.b    (a0)            *文字列終端コードを書き込む
  334.     movea.l    (sp)+,a0        *}レジスタ復帰
  335.     rts
  336.  
  337. *****************************************************************
  338. *    スペース・TABをスキップする                *
  339. *****************************************************************
  340. skipsp0:
  341.     addq.l    #1,a2
  342. skipsp:
  343.     cmpi.b    #$20,(a2)
  344.     beq    skipsp0
  345.     cmpi.b    #$09,(a2)
  346.     beq    skipsp0
  347.     rts
  348.  
  349. *****************************************************************
  350. *    小文字→大文字変換ルーチン                *
  351. *****************************************************************
  352. toupper:
  353.     cmpi.b    #'a',d0
  354.     bcs    toupr0
  355.     cmpi.b    #'z'+1,d0
  356.     bcc    toupr0
  357.     subi.b    #$20,d0
  358. toupr0:
  359.     rts
  360.  
  361. *****************************************************************
  362. *    メイン処理                        *
  363. *****************************************************************
  364. main:
  365.     clr.w    line_cnt(a6)        *ラインカウント初期化
  366.     lea.l    arg1(a6),a0        *ファイル名セット
  367.     bsr    file_open        *ファイルオープン
  368.     bsr    file_size        *ファイルサイズを調べる
  369.     move.l    d6,fi_size(a6)
  370.  
  371.     movea.l    buff_addr(a6),a5    *画像サイズのチェック
  372.     moveq.l    #4,d6
  373.     bsr    file_read
  374.     bsr    size_chk
  375.  
  376.     move.w    line_byte1(a6),d0    *メモリチェック
  377.     add.w    line_byte2(a6),d0
  378.     ext.l    d0
  379.     cmp.l    buff_size(a6),d0
  380.     bhi    main9
  381.  
  382.     bsr    convert            *コンバート
  383.  
  384.     move.w    in_file(a6),-(sp)    *ファイルCLOSE
  385.     DOS    _CLOSE
  386.     addq.l    #2,sp
  387.  
  388.     addq.w    #1,file_cnt(a6)
  389.     rts
  390.  
  391. main9:
  392.     move.w    in_file(a6),-(sp)    *メモリが全然足りない(;_;
  393.     DOS    _CLOSE
  394.     addq.l    #2,sp
  395.     bra    no_buff
  396.  
  397. *****************************************************************
  398. *    サイズチェック                        *
  399. *****************************************************************
  400. size_chk:
  401.     movea.l    buff_addr(a6),a0    *縦横サイズ求める
  402.     move.w    (a0)+,d0
  403.     ror.w    #8,d0
  404.     move.w    d0,yoko(a6)
  405.     move.w    (a0)+,d1
  406.     ror.w    #8,d1
  407.     move.w    d1,tate(a6)
  408.  
  409.     add.w    d0,d0            *GLXファイルかチェック
  410.     mulu.w    d1,d0
  411.     addq.l    #4,d0
  412.     cmp.l    fi_size(a6),d0
  413.     bne    file_er
  414.  
  415.     move.w    yoko(a6),d0        *1ラインのバイト数(読み込み側)
  416.     add.w    d0,d0            *YOKO*2
  417.     move.w    d0,line_byte1(a6)
  418.  
  419.     move.w    yoko(a6),d0        *1ラインのバイト数(書き込み側)
  420.     move.w    d0,d1            *YOKO*3
  421.     add.w    d1,d1
  422.     add.w    d1,d0
  423.     move.w    d0,line_byte2(a6)
  424.     rts
  425.  
  426. *****************************************************************
  427. *    コンバート                        *
  428. *****************************************************************
  429. convert:
  430.     bsr    prt0
  431.     bsr    prt1
  432.  
  433.     bsr    save_name_set        *書き込むファイル名作成
  434.     bsr    ipr_set            *IPRファイル作成
  435.     lea.l    arg2(a6),a0        *RGBファイル作成
  436.     bsr    file_create
  437.  
  438.     move.w    line_byte1(a6),d0    *一回に変換できるライン数(d3)を求める
  439.     add.w    line_byte2(a6),d0
  440.     move.l    buff_size(a6),d3
  441.     divu.w    d0,d3
  442.  
  443.     cmp.w    tate(a6),d3        *一回で変換できるか
  444.     bls    convert1        *できない
  445.  
  446.     move.w    tate(a6),d3
  447.     moveq.l    #1,d4
  448.     moveq.l    #0,d5
  449.     bra    convert2
  450.  
  451. convert1:
  452.     moveq.l    #0,d5            *繰り返し数(d4)と残り(d5)を求める
  453.     move.w    tate(a6),d5
  454.     divu.w    d3,d5
  455.     move.w    d5,d4
  456.     swap    d5
  457.  
  458. convert2:
  459.     move.w    line_byte1(a6),d0    *変換先アドレスを求める
  460.     mulu.w    d3,d0
  461.     add.l    buff_addr(a6),d0
  462.     move.l    d0,gr_addr(a6)
  463.  
  464.     bsr    convert4
  465.     tst.w    d5            *半端分があるか
  466.     beq    convert3        *ない
  467.     moveq.l    #1,d4
  468.     move.w    d5,d3
  469.     bsr    convert4
  470.  
  471. convert3:
  472.     move.w    out_file(a6),-(sp)    *ファイルCLOSE
  473.     DOS    _CLOSE
  474.     addq.l    #2,sp
  475.     bsr    prt3
  476.     rts
  477.  
  478. convert4:
  479.     subq.w    #1,d4
  480. convert4_:
  481.     movea.l    buff_addr(a6),a5    *読み込み
  482.     move.w    line_byte1(a6),d6
  483.     mulu.w    d3,d6
  484.     bsr    file_read
  485.  
  486.     move.w    d3,d7            *コンバート
  487.     bsr    gr_conv
  488.  
  489.     move.l    gr_addr(a6),a5        *書き込み
  490.     move.w    line_byte2(a6),d6
  491.     mulu.w    d3,d6
  492.     bsr    file_write
  493.  
  494.     dbra.w    d4,convert4_        *繰り返し
  495.     rts
  496.  
  497. *****************************************************************
  498. *    画像変換                        *
  499. *****************************************************************
  500. gr_conv:
  501.     movem.l    d0-d7/a0/a2,-(sp)
  502.  
  503.     subq.w    #1,d7            *繰り返し数-1
  504.     movea.l    buff_addr(a6),a0    *変換元アドレス
  505.     movea.l    gr_addr(a6),a2        *変換先アドレス
  506.  
  507.     move.w    #%11111000_00000000,d0    *マスクデータ
  508.     move.w    #%00000111_11000000,d1
  509.     move.w    #%00000000_00111110,d2
  510.     move.w    #%00000000_00000111,d3
  511.  
  512.     tst.b    mflg(a6)
  513.     bne    gr_conv10
  514.  
  515. gr_conv0:
  516.     bsr    prt2
  517.     move.w    yoko(a6),d6
  518.     subq.w    #1,d6
  519.  
  520. gr_conv1:
  521.     move.w    (a0)+,d4
  522.  
  523.     move.w    d4,d5            *R
  524.     and.w    d1,d5
  525.     ror.w    #3,d5
  526.     beq    gr_conv2
  527.     or.w    d3,d5
  528. gr_conv2:
  529.     move.b    d5,(a2)+
  530.  
  531.     move.w    d4,d5            *G
  532.     and.w    d0,d5
  533.     rol.w    #8,d5
  534.     beq    gr_conv3
  535.     or.w    d3,d5
  536. gr_conv3:
  537.     move.b    d5,(a2)+
  538.  
  539.     and.w    d2,d4            *B
  540.     rol.w    #2,d4
  541.     beq    gr_conv4
  542.     or.w    d3,d4
  543. gr_conv4:
  544.     move.b    d4,(a2)+
  545.  
  546.     dbra.w    d6,gr_conv1
  547.     dbra.w    d7,gr_conv0
  548.     movem.l    (sp)+,d0-d7/a0/a2
  549.     rts
  550.  
  551.  
  552. gr_conv10:
  553.     bsr    prt2
  554.     move.w    yoko(a6),d6
  555.     subq.w    #1,d6
  556.  
  557. gr_conv11:
  558.     move.w    (a0)+,d3
  559.     move.w    d3,d4
  560.     move.w    d3,d5
  561.  
  562.     and.w    d0,d3            *G
  563.     and.w    d1,d4            *R
  564.     and.w    d2,d5            *B
  565.  
  566.     rol.w    #8,d3
  567.     ror.w    #3,d4
  568.     rol.w    #2,d5
  569.  
  570.     move.b    d4,(a2)+        *R
  571.     move.b    d3,(a2)+        *G
  572.     move.b    d5,(a2)+        *B
  573.  
  574.     dbra.w    d6,gr_conv11
  575.     dbra.w    d7,gr_conv10
  576.     movem.l    (sp)+,d0-d7/a0/a2
  577.     rts
  578.  
  579. *****************************************************************
  580. *    IPRファイルの作成                    *
  581. *****************************************************************
  582. ipr_set:
  583.     bsr    ipr_name_set        *IPR名の作成
  584.  
  585.     lea.l    arg3(a6),a0        *IPRファイル作成
  586.     bsr    file_create
  587.  
  588.     movea.l    buff_addr(a6),a0
  589.     movea.l    a0,a5
  590.  
  591.     move.w    yoko(a6),d0        *横
  592.     bsr    ipr_set9
  593.     move.b    #SPACE,(a0)+
  594.  
  595.     move.w    tate(a6),d0        *縦
  596.     bsr    ipr_set9
  597.     move.b    #SPACE,(a0)+
  598.  
  599.     move.b    #'0',(a0)+
  600.     move.b    #SPACE,(a0)+
  601.     move.b    #'0',(a0)+
  602.  
  603.     sub.l    a5,a0
  604.     move.l    a0,d6            *ヘッダ書き込み
  605.     bsr    file_write
  606.  
  607.     move.w    out_file(a6),-(sp)    *ファイルCLOSE
  608.     DOS    _CLOSE
  609.     addq.l    #2,sp
  610.     rts
  611.  
  612. ipr_set9:
  613.     move.l    a0,-(sp)
  614.     ext.l    d0
  615.     lea.l    dec_buf(a6),a0
  616.     bsr    bin2dec
  617.     bsr    zero_keshi
  618.     movea.l    a0,a1
  619.     movea.l    (sp)+,a0
  620.     bsr    strcpy
  621.     rts
  622.  
  623. *****************************************************************
  624. *    IPR名の作成                        *
  625. *****************************************************************
  626. ipr_name_set:
  627.     lea.l    arg2(a6),a1        *転送元
  628.     lea.l    arg3(a6),a0        *転送先
  629.     bsr    strcpy            *ファイル名を複写する
  630.  
  631.     lea.l    arg3(a6),a0
  632.     lea.l    cext1(pc),a1
  633.     bsr    cheng_ext
  634.     rts
  635.  
  636. *****************************************************************
  637. *    セーブ名の作成                        *
  638. *****************************************************************
  639. save_name_set:
  640.     lea.l    filbuf(a6),a1        *転送元
  641.     lea.l    30(a1),a1
  642.     movea.l    nameichi(a6),a0        *転送先
  643.     bsr    strcpy            *ファイル名を複写する
  644.  
  645.     lea.l    arg2(a6),a0
  646.     lea.l    cext2(pc),a1
  647.     bsr    cheng_ext
  648.     rts
  649.  
  650. *****************************************************************
  651. *    拡張子を変更する                    *
  652. *****************************************************************
  653. cheng_ext:
  654. *    lea.l    arg2(a6),a0        *ファイル名のアドレス
  655. *    lea.l    cext(pc),a1
  656. cheng_ext0:
  657.     cmp.b    #".",(a0)+        *拡張子があるか
  658.     bne    cheng_ext0
  659.     subq.l    #1,a0            *行きすぎたから1つ戻る
  660. cheng_ext1:
  661.     move.b    (a1)+,(a0)+        *1文字転送
  662.     bne    cheng_ext1        *終了コードまで繰り返す
  663. cheng_ext2:
  664.     rts
  665.  
  666. *****************************************************************
  667. *    表示関係                        *
  668. *****************************************************************
  669. prt0:                    *表示バッファ初期化
  670.     movem.l    d0/a0,-(sp)
  671.     lea.l    prt_buff(a6),a0
  672.     moveq.l    #96-1,d0
  673. prt0_:
  674.     move.b    #SPACE,(a0)+
  675.     dbra.w    d0,prt0_
  676.     clr.b    (a0)+
  677.     movem.l    (sp)+,d0/a0
  678.     rts
  679.  
  680. prt1:                    *ファイル名とサイズ表示
  681.     movem.l    d0/a0-a1,-(sp)
  682.  
  683.     lea.l    prt_buff(a6),a0
  684.     lea.l    filbuf(a6),a1
  685.     lea.l    30(a1),a1
  686.     bsr    strcpy
  687.     move.b    #SPACE,(a0)
  688.  
  689.     lea.l    prt_buff(a6),a0        *位置合わせ
  690.     adda.l    #22,a0
  691.  
  692.     move.b    #"(",(a0)+
  693.     move.w    yoko(a6),d0
  694.     bsr    dec_set
  695.     move.b    #",",(a0)+
  696.     move.w    tate(a6),d0
  697.     bsr    dec_set
  698.     move.b    #")",(a0)+
  699.     lea.l    crlf_mes(pc),a1
  700.     bsr    strcpy
  701.     lea.l    prt_buff(a6),a0
  702.     bsr    mesput
  703.     movem.l    (sp)+,d0/a0-a1
  704.     rts
  705.  
  706. prt2:                    *変換ライン数表示
  707.     movem.l    d0-d1/a0-a1,-(sp)
  708.  
  709.     lea.l    prt_buff(a6),a0
  710.  
  711.     addq.w    #1,line_cnt(a6)
  712.     move.w    line_cnt(a6),d0
  713.     bsr    dec_set
  714.     move.b    #"/",(a0)+
  715.     move.w    tate(a6),d0
  716.     bsr    dec_set
  717.  
  718.     lea.l    henkan_mes(pc),a1
  719.     bsr    strcpy
  720.     lea.l    crlf_mes(pc),a1
  721.     bsr    strcpy
  722.  
  723.     IOCS    _B_UP_S
  724.     moveq.l    #40,d1
  725.     IOCS    _B_RIGHT
  726.     lea.l    prt_buff(a6),a0
  727.     bsr    mesput
  728.     movem.l    (sp)+,d0-d1/a0-a1
  729.     rts
  730.  
  731. prt3:                    *'終了!'表示
  732.     movem.l    d0-d1/a0-a1,-(sp)
  733.     lea.l    prt_buff(a6),a0
  734.     lea.l    syuryo_mes(pc),a1
  735.     bsr    strcpy
  736.     lea.l    crlf_mes(pc),a1
  737.     bsr    strcpy
  738.  
  739.     IOCS    _B_UP_S
  740.     moveq.l    #49,d1
  741.     IOCS    _B_RIGHT
  742.     lea.l    prt_buff(a6),a0
  743.     bsr    mesput
  744.     movem.l    (sp)+,d0-d1/a0-a1
  745.     rts
  746.  
  747. dec_set
  748.     move.l    a0,-(sp)
  749.     ext.l    d0
  750.     lea.l    dec_buf(a6),a0
  751.     bsr    bin2dec
  752.     bsr    zero_keshi
  753.     move.l    (sp)+,a0
  754.     lea.l    dec_buf(a6),a1
  755.     addq.l    #6,a1
  756.     bsr    strcpy
  757.     rts
  758.  
  759. *****************************************************************
  760. *    2進=>10進                        *
  761. *    d0 変換元の数値 a0 変換後の格納アドレス            *
  762. *****************************************************************
  763. bin2dec:
  764.     movem.l    d0-d3/a0-a1,-(sp)
  765.     moveq.l    #10-1,d1
  766.     lea.l    exp_tbl(pc),a1
  767. bin2dec0:
  768.     clr.b    d2
  769.     move.l    (a1)+,d3
  770. bin2dec1:
  771.     or    d3,d3
  772.     sub.l    d3,d0
  773.     bcs    bin2dec2
  774.     addq.b    #1,d2
  775.     bra    bin2dec1
  776. bin2dec2:
  777.     add.l    d3,d0
  778.     add.b    #'0',d2
  779.     move.b    d2,(a0)+
  780.     dbra    d1,bin2dec0
  781.     movem.l    (sp)+,d0-d3/a0-a1
  782.     rts
  783.  
  784. exp_tbl:
  785.     .dc.l    1000000000
  786.     .dc.l    100000000
  787.     .dc.l    10000000
  788.     .dc.l    1000000
  789.     .dc.l    100000
  790.     .dc.l    10000
  791.     .dc.l    1000
  792.     .dc.l    100
  793.     .dc.l    10
  794.     .dc.l    1
  795.  
  796. *****************************************************************
  797. *    ファイルサイズの頭にある'0'を消す            *
  798. *****************************************************************
  799. zero_keshi:
  800.     lea.l    dec_buf(a6),a0
  801.     moveq.l    #9-1,d0
  802. zero_keshi0:
  803.     cmp.b    #'0',(a0)
  804.     bne    zero_keshi9
  805.     move.b    #SPACE,(a0)+
  806.     dbra.w    d0,zero_keshi0
  807. zero_keshi9:
  808.     rts
  809.  
  810. *****************************************************************
  811. *    ファイルのOPENを行う                *
  812. *****************************************************************
  813. file_open:
  814.     move.w    #0,-(sp)        *ファイルopen
  815.     move.l    a0,-(sp)
  816.     DOS    _OPEN
  817.     addq.l    #6,sp
  818.     tst.l    d0
  819.     bmi    open_err
  820.     move.w    d0,in_file(a6)
  821.     rts
  822.  
  823. *****************************************************************
  824. *    ファイルのサイズを求める(d6に返す)            *
  825. *****************************************************************
  826. file_size:
  827.     move.w    #2,-(sp)
  828.     move.l    #0,-(sp)
  829.     move.w    in_file(a6),-(sp)
  830.     DOS    _SEEK
  831.     addq.l    #8,sp
  832.     tst.l    d0            *OK?
  833.     bmi    read_err
  834.  
  835.     move.l    d0,d6
  836.  
  837.     move.w    #0,-(sp)
  838.     move.l    #0,-(sp)
  839.     move.w    in_file(a6),-(sp)
  840.     DOS    _SEEK
  841.     addq.l    #8,sp
  842.     tst.l    d0            *OK?
  843.     bmi    read_err
  844.     rts
  845.  
  846. *****************************************************************
  847. *    ディスクからデータの読み込みを行う            *
  848. *****************************************************************
  849. file_read:
  850.     move.l    d6,-(sp)        *データサイズ
  851.     move.l    a5,-(sp)        *バッファアドレス
  852.     move.w    in_file(a6),-(sp)
  853.     DOS    _READ
  854.     lea    10(sp),sp
  855.     tst.l    d0
  856.     bmi    read_err
  857.     cmp.l    d6,d0
  858.     bne    read_err
  859.     rts
  860.  
  861. *****************************************************************
  862. *    ファイル作成                        *
  863. *****************************************************************
  864. file_create:
  865.     move.w    #$20,-(sp)        *ファイルCREATE
  866.     move.l    a0,-(sp)
  867.     DOS    _CREATE
  868.     addq.l    #6,sp
  869.  
  870.     tst.l    d0
  871.     bmi    create_err
  872.     move.w    d0,out_file(a6)
  873.     rts
  874.  
  875. *****************************************************************
  876. *    ディスクに書き込む                    *
  877. *****************************************************************
  878. file_write:
  879.     move.l    d6,-(sp)        *データサイズ
  880.     move.l    a5,-(sp)        *バッファアドレス
  881.     move.w    out_file(a6),-(sp)
  882.     DOS    _WRITE
  883.     lea.l    10(sp),sp
  884.     tst.l    d0
  885.     bmi    write_err
  886.     cmp.l    d6,d0
  887.     bne    write_err
  888.     rts
  889.  
  890. *****************************************************************
  891. *    バッファ確保                        *
  892. *****************************************************************
  893. buf_get:
  894.     pea.l    -1.w            *確保出来る最大サイズを取得
  895.     DOS    _MALLOC
  896.     addq.l    #4,sp
  897.     andi.l    #$00ffffff,d0
  898.     move.l    d0,d1
  899.     move.l    d0,-(sp)
  900.     DOS    _MALLOC
  901.     addq.l    #4,sp
  902.     tst.l    d0
  903.     bmi    no_buff
  904.  
  905.     move.l    d0,buff_addr(a6)    *バッファアドレス
  906.     move.l    d1,buff_size(a6)    *バッファサイズ
  907.     rts
  908.  
  909. *****************************************************************
  910. *    バッファ開放                        *
  911. *****************************************************************
  912. buf_free:
  913.     pea.l    buff_addr(a6)        *バッファ開放
  914.     DOS    _MFREE
  915.     addq.l    #4,sp
  916.     rts
  917.  
  918. *****************************************************************
  919. *    処理したファイル数をチェックする            *
  920. *****************************************************************
  921. file_cnt_chk:
  922.     tst.w    file_cnt(a6)        *処理したファイルは0個か
  923.     bne    file_cnt_chk1        *違う
  924.     lea.l    no_file_mes(pc),a0
  925.     bsr    mesput
  926. file_cnt_chk1:
  927.     rts
  928.  
  929. *****************************************************************
  930. *    ファイル名エラー                    *
  931. *****************************************************************
  932. name_er:
  933.     lea.l    in_mes(pc),a0
  934.     bsr    mesput
  935.     lea.l    name_er_mes(pc),a0
  936.     bsr    mesput
  937.     bra    exit2
  938.  
  939. *****************************************************************
  940. *    ファイルエラー                        *
  941. *****************************************************************
  942. file_er:
  943.     move.w    in_file(pc),-(sp)    *ファイルCLOSE
  944.     DOS    _CLOSE
  945.     addq.l    #2,sp
  946.  
  947.     lea.l    arg1(a6),a0
  948.     bsr    mesput
  949.     lea.l    file_er_mes(pc),a0
  950.     bsr    mesput
  951.     bra    exit2
  952.  
  953. *****************************************************************
  954. *    メモリが足りない                    *
  955. *****************************************************************
  956. no_buff:
  957.     lea.l    arg1(a6),a0
  958.     bsr    mesput
  959.     lea.l    no_buff_mes(pc),a0
  960.     bsr    mesput
  961.     bra    exit2
  962.  
  963. *****************************************************************
  964. *    ファイルが見付からない                    *
  965. *****************************************************************
  966. open_err:
  967.     lea.l    arg1(a6),a0
  968.     bsr    mesput
  969.     lea.l    open_er_mes(pc),a0
  970.     bsr    mesput
  971.     bra    exit2
  972.  
  973. *****************************************************************
  974. *    読み込みエラー                        *
  975. *****************************************************************
  976. read_err:
  977.     lea.l    arg1(a6),a0
  978.     bsr    mesput
  979.     lea.l    read_er_mes(pc),a0
  980.     bsr    mesput
  981.     bra    exit2
  982.  
  983. *****************************************************************
  984. *    出力パス名エラー                    *
  985. *****************************************************************
  986. out_name_err:
  987.     lea.l    out_mes(pc),a0
  988.     bsr    mesput
  989.     lea.l    name_er_mes(pc),a0
  990.     bsr    mesput
  991.     bra    exit2
  992.  
  993. *****************************************************************
  994. *    ファイル作成エラー                    *
  995. *****************************************************************
  996. create_err:
  997.     lea.l    arg2(a6),a0
  998.     bsr    mesput
  999.     lea.l    create_er_mes(pc),a0
  1000.     bsr    mesput
  1001.     bra    exit2
  1002.  
  1003. *****************************************************************
  1004. *    ファイル書き込みエラー                    *
  1005. *****************************************************************
  1006. write_err:
  1007.     lea.l    arg2(a6),a0
  1008.     bsr    mesput
  1009.     lea.l    write_er_mes(pc),a0
  1010.     bsr    mesput
  1011.     bra    exit2
  1012.  
  1013. *****************************************************************
  1014. *    使用方表示                        *
  1015. *****************************************************************
  1016. usage:
  1017.     lea.l    usage_mes(pc),a0
  1018.     bsr    mesput
  1019.     bra    exit2
  1020.  
  1021. *****************************************************************
  1022. *    メッセージ表示                        *
  1023. *****************************************************************
  1024. mesput:
  1025. *    move.w    #STDERR,-(sp)        *標準エラー出力へ
  1026.     move.w    #STDOUT,-(sp)        *標準出力へ
  1027.     move.l    a0,-(sp)        *メッセージを
  1028.     DOS    _FPUTS            *出力する
  1029.     addq.l    #6,sp            *スタック補正
  1030.     rts
  1031.  
  1032. *****************************************************************
  1033. *    終了処理                        *
  1034. *****************************************************************
  1035. exit:
  1036.     IOCS    _MS_INIT        *キーバッファクリア
  1037.     moveq.l    #-1,d1
  1038.     IOCS    _SKEY_MOD
  1039.     move.w    #-1,-(sp)
  1040.     DOS    _KFLUSH
  1041.     addq.l    #2,sp
  1042.     rts
  1043.  
  1044. *****************************************************************
  1045. *    エラー処理2                        *
  1046. *****************************************************************
  1047. exit2:
  1048.     bsr    exit
  1049.     move.w    #1,-(sp)        *終了コード1を持って
  1050.     DOS    _EXIT2            * エラー終了
  1051.  
  1052. *****************************************************************
  1053. *    データエリア                        *
  1054. *****************************************************************
  1055.     .data
  1056.     .even
  1057. usage_mes:
  1058.     .dc.b    'GLX to RGB converter V0.01 by A.MUKAWA',CR,LF
  1059.     .dc.b    '機能:マチエールでお馴染みのGLXファイルを 24bitベタのRGBファイルにコンバートします',CR,LF
  1060.     .dc.b    '用法:GLX2RGB [スイッチ] ファイル名 [セーブ先パス]',CR,LF
  1061.     .dc.b    CR,LF
  1062.     .dc.b    '               /M    マチエール互換のRGBファイルにする',CR,LF
  1063.     .dc.b    0
  1064.  
  1065. in_mes:
  1066.     .dc.b    '入力ファイル',0
  1067. out_mes:
  1068.     .dc.b    '出力先パス',0
  1069. name_er_mes:
  1070.     .dc.b    '名の指定に間違いがあります!',CR,LF,0
  1071. file_er_mes:
  1072.     .dc.b    ' はファイルが壊れているか、GLXファイルではないようです!',CR,LF,0
  1073. open_er_mes:
  1074.     .dc.b    ' が見つかりません!',CR,LF,0
  1075. read_er_mes:
  1076.     .dc.b    ' の読み込みエラーが発生しました!',CR,LF,0
  1077. no_buff_mes:
  1078.     .dc.b    ' の変換に必要なメモリがありません!',CR,LF,0
  1079. create_er_mes:
  1080.     .dc.b    ' が作れません!',CR,LF,0
  1081. write_er_mes:
  1082.     .dc.b    ' の書き込みエラーが発生しました!',CR,LF,0
  1083. no_file_mes:
  1084.     .dc.b    '変換できるファイルがありませんでした!',CR,LF,0
  1085. henkan_mes:
  1086.     .dc.b    ' 変換中',0
  1087. syuryo_mes:
  1088.     .dc.b    ' 終了!',0
  1089. crlf_mes:
  1090.     .dc.b    CR,LF,0
  1091. func_off_mes:
  1092.     .dc.b    $1b,$5b,$3e,$31,$68,0
  1093. sla_mes:
  1094.     .dc.b    '/',0
  1095.  
  1096. dext:
  1097.     .dc.b    '.GLX',0        *補う拡張子
  1098. komekome:
  1099.     .dc.b    '\'
  1100. kome0:
  1101.     .dc.b    '*.GLX',0
  1102. cext1:
  1103.     .dc.b    '.IPR',0        *変更する拡張子
  1104. cext2:
  1105.     .dc.b    '.RGB',0        *変更する拡張子
  1106.  
  1107. *****************************************************************
  1108. *    ワークエリア                        *
  1109. *****************************************************************
  1110.  
  1111.     .offset    0
  1112. filbuf:
  1113.     .ds.b    53            *ファイル情報格納バッファ
  1114. nambuf:
  1115.     .ds.b    92            *ファイル名展開用バッファ
  1116. arg1:
  1117.     .ds.b    256            *入力ファイル名バッファ
  1118. arg2:
  1119.     .ds.b    256            *出力ファイル名バッファ
  1120. arg3:
  1121.     .ds.b    256            *IPRファイル名バッファ
  1122. cpathbuf
  1123.     .ds.b    65            *カレントパス名バッファ
  1124. spathbuf
  1125.     .ds.b    65            *セーブ先パス名バッファ
  1126.     .even
  1127. buff_addr:
  1128.     .ds.l    1            *画像読み込みバッファアドレス
  1129. buff_size:
  1130.     .ds.l    1            *画像読み込みバッファサイズ
  1131. gr_addr:
  1132.     .ds.l    1            *画像データアドレス
  1133. fi_size:
  1134.     .ds.l    1            *ファイルサイズ
  1135. yoko:
  1136.     .ds.w    1            *画像の横(X)サイズ
  1137. tate:
  1138.     .ds.w    1            *画像の縦(Y)サイズ
  1139. line_byte1:
  1140.     .ds.w    1            *1ラインのバイト数(読み込み側)
  1141. line_byte2:
  1142.     .ds.w    1            *1ラインのバイト数(書き込み側)
  1143. line_cnt:
  1144.     .ds.w    1
  1145. file_cnt:
  1146.     .ds.w    1
  1147. nameichi:
  1148.     .ds.l    1
  1149. in_file:
  1150.     .ds.w    1
  1151. out_file:
  1152.     .ds.w    1
  1153. dec_buf:
  1154.     .ds.b    10+1
  1155. prt_buff:
  1156.     .ds.b    96+1
  1157. mflg:
  1158.     .ds.b    1
  1159.     .even
  1160. WORK_SIZE:
  1161.  
  1162.     .bss
  1163.     .even
  1164. work:
  1165.     .ds.b    WORK_SIZE
  1166. my_stack:
  1167.     .ds.l    1024
  1168. mysp:
  1169.     .end    start
  1170.